Итак, объект COM можно поместить в DLL или EXE, мы с Вами поместим его в DLL. Итак в минимальном виде нам нужен проект DLL, в котором должны быть реализованы две функции:
DllGetClassObject DllCanUnloadNowЭти имена функций не просто придуманы. Они входят в понятие COM API есть набор функций, которые позволяют использовать COM. Например, DllGetClassObject извлекает объект, то есть дает к нему доступ. Набор функций связанных с COM называют библиотекой COM.
В самом DLL необходимо реализовать классы, которые наследуют необходимые интерфейсы и их реализуют. О некоторых из них я рассказал в предыдущих шагах. Для примера вот такой
class MathClassFactory : public IClassFactory
{
protected:
long m_lRef;
public:
MathClassFactory();
~MathClassFactory();
// IUnknown
STDMETHOD( QueryInterface(REFIID, void** ));
STDMETHOD_(ULONG, AddRef());
STDMETHOD_(ULONG, Release());
// IClassFactory
STDMETHOD(CreateInstance)(LPUNKNOWN, REFIID, void**);
STDMETHOD(LockServer)(BOOL);
};
Так необходимо зарегистрировать компонент. Это можно сделать в простом случае с использованием REG файла. Например такого:
REGEDIT
HKEY_CLASSES_ROOT\Chapter2.Math.1 = Chapter2 Math Component
HKEY_CLASSES_ROOT\Chapter2.Math.1\CLSID = {A888F560-58E4-11d0-A68A-0000837E3100}
HKEY_CLASSES_ROOT\Chapter2.Math = Chapter2 Math Component
HKEY_CLASSES_ROOT\Chapter2.Math\CurVer = Chapter2.Math.1
HKEY_CLASSES_ROOT\Chapter2.Math\CLSID = {A888F560-58E4-11d0-A68A-0000837E3100}
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100} = Chapter2 Math Component
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\ProgID = Chapter2.Math.1
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\VersionIndependentProgID = Chapter2.Math
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\InprocServer32 = D:\PROJECT\server\Debug\server.dll
Вот теперь объект COM в минимальной реализации готов. Для его использования нужен клиент. Клиент будет пользоваться функциями.
CLSIDFromProgID CoGetClassObject
Вот так. Давайте еще раз сформулируем.
Класс с наследованием и реализацитей интерфейсов IUnknown, ICLassFactory etc .... Правильно оформленный DLL с функцией DllGetClassObject Регистрация компонента с использованием реестра и REG файла
Если всё это есть, то на C++ мы сможем реализовать клиента COM объекта.